import re

import random
from flask import session
import re

from flask import current_app
from flask import request,jsonify
from info import rs, db
from info.models import User
from info.utils.captcha.captcha import captcha
from info.utils.response_code import RET
from info.utils.yuntongxun.sms import CCP
from . import passport_blu
from flask import make_response
from info import constants



#图片验证码视图函数
@passport_blu.route('/image_code')
def image_code():
    #
    # # return  '11'
    # 1.获取uuid
    uuid = request.args.get('image_code_id')

    #1.1判空
    if not uuid:

        return jsonify(errno=RET.DATAERR, errmsg='参数不完成')

    # ２．返回图片验证
    # 第一个是图片的名称，第二个是验证码文本，第三个是验证码图片的内容

    name, text, content = captcha.generate_captcha()


    try:
    #     #3.储存uuid以及图片验证码文本到redis
        rs.set("Image_code_id_"+ uuid,text,constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存图片验证码失败")

    response=make_response(content)

    response.headers['content-type']='image/jpg'



    return response


@passport_blu.route('/sms_code',methods=['POST'])
def sms_code():



    #1.获取参数
    json_dict = request.json     #获取json数据并转换成字典　mobile
    mobile=json_dict['mobile']
    image_code=json_dict['image_code']
    image_code_id=json_dict['image_code_id']

    #判空
    if not all([mobile, image_code, image_code_id]):
        #如果是空的则return
        return jsonify(errno=RET.DATAERR, errmsg='参数不完成')

    #2.判断各参数是否正确
    #判断手机是否正确,不正确则return
    if not re.match(r'^1[3578]\d{9}$',mobile):
        return jsonify(errno=RET.DATAERR, errmsg='参数不完成')

    try:
        #获取真实的验证码
        real_code = rs.get("Image_code_id_"+image_code_id)

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="连接数据库错误")
    # 验证是否获取到了数据有,没有则turn
    if not real_code:
        return jsonify(errno=RET.NODATA, errmsg="验证码过期")

    # #判断真实的验证码是否等于用户输入的
    # if real_code.decode().lower() != image_code.lower():
    #
    #     #如果不一样．则return
    #     return jsonify(errno=RET.DATAERR, errmsg="验证码错误")

    # 判断sql数据库中是否已经存在该手机的数据
    try:
        user_mobile = User.query.filter(User.mobile ==mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="连接数据库错误")
    #判空,如果不为空，则return
    if  user_mobile:
        return jsonify(errno=RET.DATAERR, errmsg="该手机号已经注册")

    #3.发送验证码
    ccp = CCP()
    #生成６位数的随机数
    sms_code = random.randint(0,1000000)
    sms_code = '%06d' %sms_code
    # print(sms_code)
    # ccp.send_template_sms(mobile, [sms_code, mobile,5], 1)

    #4.把验证码储存到数据库里

    try:
    #     #3.储存uuid以及图片验证码文本到redis
        rs.set("Sms_code_id_"+ mobile,sms_code,constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存图片验证码失败")

    #5.通过所有，则返回成功

    return jsonify(errno=RET.OK, errmsg="操作成功")


#注册
@passport_blu.route('/register',methods=['POST'])
def register():

    #1.获取参数　"mobile" sms_code password agree
    register_dict = request.json
    mobile = register_dict['mobile']
    sms_code = register_dict['sms_code']
    password = register_dict['password']
    agree = register_dict['agree']



    #1.1判空,如果有空则return
    if not all([mobile, sms_code, password, agree]):
        return jsonify(errno=RET.DATAERR, errmsg='参数不完成')

    #1.2判断手机是否符合规则
    if not re.match(r'^1[3578]\d{9}$', mobile):
        return jsonify(errno=RET.DATAERR, errmsg='参数不完成')

    #1.3判断用户输入的验证码是否正确

    try:
        #获取验证码
        real_code = rs.get("Sms_code_id_"+mobile)

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="连接数据库错误")
    # 验证是否获取到了数据有,没有则turn
    if not real_code:
        return jsonify(errno=RET.NODATA, errmsg="验证码过期")


    # #判断真实的验证码是否等于用户输入的
    if real_code.decode() != sms_code:

        #如果不一样．则return
        return jsonify(errno=RET.DATAERR, errmsg="验证码错误")

    #2.数据验证完毕后，将用户的注册信息填入User表中
    #2.1 填写用户数据
    user = User()
    user.nick_name = mobile
    user.password = password
    user.mobile = mobile
    #2.2提交数据
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="连接数据库错误")

    #3.设置状态保持
    session['user_id'] = user.id
    session['mobile'] = user.mobile
    session['nick_name'] = user.nick_name

    #4.成功

    return jsonify(errno=RET.OK, errmsg="操作成功")

#登录
@passport_blu.route('/login',methods=['POST'])
def login():

    #1.获取参数
    register_dict = request.json
    mobile = register_dict['mobile']
    password = register_dict['password']

    #1.1判空,如果有空则return
    if not all([mobile,  password]):
        return jsonify(errno=RET.DATAERR, errmsg='参数不完成')

    #1.2判断手机是否符合规则
    if not re.match(r'^1[3578]\d{9}$', mobile):
        return jsonify(errno=RET.DATAERR, errmsg='手机号不符')

    #2.判断是否已经存在数据
    #2.1判断手机是否已经注册
        # 判断sql数据库中是否已经存在该手机的数据
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="连接数据库错误")
        # 判空,如果为空，则return
    if not user:
        return jsonify(errno=RET.DATAERR, errmsg="该手机号未注册")

    #2.2判断密码是否正确,如果不正确，则return
    if not user.check_passowrd(password):
        return jsonify(errno=RET.PWDERR, errmsg='密码不正确')

    #3.设置状态保持
    session['user_id'] = user.id
    session['mobile'] = user.mobile
    session['nick_name'] = user.nick_name

    # 4.成功

    return jsonify(errno=RET.OK, errmsg="操作成功")

@passport_blu.route('/logout')
def logout():

    #删除session
    session.pop('user_id')
    session.pop('mobile')
    session.pop('nick_name')

    #记录用户最后一次登录实际
    from datetime import datetime
    from sqlalchemy.sql.functions import user
    user.last_login = datetime.now()

    try:
        db.session.commit()
    except Exception as e:
        # 这里就可以不用return了，只记录这个错误就行，没有必要阻止用户登录
        current_app.logger.error(e)



    return jsonify(errno=RET.OK, errmsg="退出登录成功")
